/**
 * proxy
 */
// const person = {
//   name: 'zhangsan',
//   age: 21
// }
// /**
//  * 使用 new 的方式为 person 创建一个代理对象
//  * 第一个参数为代理的目标对象
//  * 第二个参数为代理的处理对象，可通过get监视属性的访问，set监视设置属性的过程
//  */
// const personProxy = new Proxy(person, {
//   /**
//    * 
//    * @param {*} target 代理的目标对象
//    * @param {*} property 外部访问的属性名
//    */
//   get(target, property) {
//     // console.log(person, property) // { name: 'zhangsan', age: 21 } 'name'
//     // return 100

//     // 判断代理对象中是否存在访问的属性名，存在则返回，否则返回默认值
//     return property in target ? target[property] : 'default'
//   },
//   /**
//    * 为代理目标设置指定的属性
//    * @param {*} target 代理的目标对象
//    * @param {*} property 外部访问的属性名
//    * @param {*} value 要写入的属性值
//    */
//   set(target, property, value) {
//     // console.log(target, property, value) // { name: 'zhangsan', age: 21 } 'gender' true

//     // 预处理: 如果设置的是age，就必须是数字，否则报错
//     if (property === 'age') {
//       if (!Number.isInteger(value)) {
//         throw new TypeError(`${value} is not a int`)
//       }
//       target[property] = value
//     }
//   }
// })

// // console.log(personProxy.name) // 100  【return 100 的时候】

// // console.log(personProxy.name) // zhangsan 【return 判断属性是否存在的时候】
// // console.log(personProxy.xx) // default 【return 判断属性是否存在的时候】

// personProxy.gender = true // 设置属性
// personProxy.age = 12 // 设置属性
// console.log(personProxy)

/**
 * proxy2
 */
// const person = {
//   name: 'jerry',
//   age: 22
// }
// const personProxy = new Proxy(person, {
//   /**
//    * 外部对当前代理对象进行delete操作时会自动执行
//    * @param {*} target 代理目标对象
//    * @param {*} property 要删除的属性名
//    */
//   deleteProperty(target, property) {
//     console.log('delete', property) // delete age
//     delete target[property]
//   }
// })
// delete personProxy.age
// console.log(person) // { name: 'jerry' }

/**
 * 支持数组对象的监视
 */
// let list = []
// let listProxy = new Proxy(list, {
//   /**
//    * 监视数据的写入
//    * @param {*} target 代理目标对象
//    * @param {*} property 要处理的数据属性
//    * @param {*} value 
//    */
//   set(target, property, value) {
//     console.log('set', property, value) // set 0 123 \n set length 1
//     target[property] = value
//     return true
//   }
// })
// listProxy.push('123')